/* main.c for !DiscEx */


#include "main.h"
#include "setup.h"
#include "dinfo.h"
#include "locate.h"
#include "scan.h"
#include "save.h"


/* the toolbox id block */

static IdBlock idblk;
static WimpPollBlock pblock;


/* iconbar events */

#define  Event_SetUp           1  /* User chooses "Set up..." */
#define  Event_DiscInfo        2  /* User chooses "Disc info..." */
#define  Event_Locate          3  /* User chooses "Locate..." */
#define  Event_Analyse         4  /* User chooses "Analyse..." */
#define  Event_Quit            5  /* User chooses "Quit" */


/* static data */

static int messages [] = {0};    /* all messages */
static int tbcodes  [] = {0};    /* all Toolbox events */

static Bool quit = FALSE;        /* set TRUE to terminate poll loop */



static Bool toolbox_error
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void  *handle
)
{
    ToolboxErrorEvent *t = (ToolboxErrorEvent *) event;
    error e;

    IGNORE(code);
    IGNORE(handle);
    IGNORE(idblock);

    e.errnum = t->errnum;
    strcpy (e.errmess, t->errmess);

    error_box (&e);

    return TRUE;
}


static Bool proginfo_show
(
    int code,                 /* event code [ProgInfo_AboutToBeShown] */
    ToolboxEvent *event,      /* Toolbox event block */
    IdBlock *idblock,         /* Toolbox Id block */
    void  *handle             /* user handle [0] */
)
{
    IGNORE(handle);
    IGNORE(event);
    IGNORE(code);
                          
    proginfo_set_version
    (
        0,                          /* flags */
        idblock->self_id,           /* object ID */
        message_lookup("Version")     /* version string */
    );

    return TRUE;
}


static Bool tbquit_handler
(
    int code,
    ToolboxEvent *event,
    IdBlock *idblock,
    void  *handle
)
{
    IGNORE(event);
    IGNORE(code);
    IGNORE(handle);
    IGNORE(idblock);

    quit = TRUE;
    return TRUE;
}


static Bool quit_handler (WimpMessage *message, void *handle)
{
    IGNORE (message);
    IGNORE (handle);

    quit = TRUE;
    return TRUE;
}


/*
 * Initialise the task (we use toolbox_initialise instead of wimp_initialise)
 * and register any events handlers.
 */

static error * app_init (void)
{
    /* initialise as a toolbox task */
    ER ( toolbox_initialise
         (
          /* IN */
             0,              /* flags */
             310,            /* earliest permissible WIMP version */
             messages,       /* list of interesting messages */
             tbcodes,        /* list of interesting Toolbox event codes */
             APPDIR,         /* name of directory containing resources */
             &mbl,           /* for the Messages file descriptor */
             &idblk,         /* address of toolbox id block */
          /* OUT */
             NULL,           /* current Wimp version */
             NULL,           /* task handle */
             NULL            /* sprite area */
         ) );
                          
    /* initialise event lib */
    ER ( event_initialise (&idblk) );
    
    /* register message and event handlers for iconbar actions */

    /* "Quit" message from Wimp */
    ER ( event_register_message_handler
         (
             Wimp_MQuit,     /* the Wimp Message */
             quit_handler,   /* the handler function for it */
             NULL            /* and a handle */
         ) );

    /* User chooses "Quit" entry from iconbar menu */
    ER ( event_register_toolbox_handler
         (
             -1,             /* for all objects */
             Event_Quit,     /* toolbox event code */
             tbquit_handler, /* the handler function for it */
             NULL            /* and a handle */
         ) );

    /* "ProgInfo" object is about to be shown */
    ER ( event_register_toolbox_handler
         (
             -1,
             ProgInfo_AboutToBeShown,
             proginfo_show,
             NULL
         ) );

    /* Choose "Set up..." from icon bar menu */
    ER ( event_register_toolbox_handler
         (
             -1,
             Event_SetUp,
             setup_request,
             NULL
         ) );

    /* Choose Disc info... from icon bar menu */
    ER ( event_register_toolbox_handler
         (
             -1,
             Event_DiscInfo,
             dinfo_request,
             NULL
         ) );

    /* Choose Locate... from icon bar menu */
    ER ( event_register_toolbox_handler
         (
             -1,
             Event_Locate,
             locate_request,
             NULL
         ) );

    /* Choose Analyse... from icon bar menu */
    ER ( event_register_toolbox_handler
         (
             -1,
             Event_Analyse,
             scan_request,
             NULL
         ) );


    /* register global handlers for SaveAs processing - see save module */

    /* SaveAs dbox about to be shown */
    ER ( event_register_toolbox_handler
         (
             -1,
             SaveAs_AboutToBeShown,
             save_show,
             NULL
         ) );

    /* SaveAs_SaveToFile event received */
    ER ( event_register_toolbox_handler
         (
             -1,
             SaveAs_SaveToFile,
             save_save,
             NULL
         ) );


    /* Trap toolbox error events */
    ER ( event_register_toolbox_handler
         (
             -1,
             Toolbox_Error,
             toolbox_error,
             NULL
         ) );


    /* load any saved setup values */
    setup_init ();

    return NULL;
}                                                              


int main (int argc, char *argv[])
{
    int code;

    /* set up debug output if DEBUG is set */
    debug_file(APPDIR".logfile");
                     
    EE ( app_init() );

    /* disable NULL events and KeyPress events */
    event_set_mask (0x101);

    while (!quit)
       ED ( event_poll
            (
                &code,      /* event code */
                &pblock,    /* Wimp poll block */
                NULL        /* address of poll word (if necessary) */
            ) );

    exit (0);
}
